home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / oasis / oasisegs.lha / egs / queena.d < prev    next >
Text File  |  1992-04-23  |  1KB  |  38 lines

  1. class queen {
  2.     constant:   int      max   = 800;
  3.                 int      n     = 10;
  4.     attribute:
  5.     protected   int      count = 0;
  6.                 int[_,_] all   = $[max,n];
  7.     method:
  8.     public      run      (int[_] Q; int ?Count; int[_,_] ?All).
  9.                 queen    (int[_] Q; int N, Size).
  10.                 more     (int[_] Q; int N, M, Size).
  11.                 safe     (int[_] Q; int M, I, N).
  12.                 copy     (int K, I; int[_] Q).
  13. }
  14.  
  15. queen {
  16.     run(Q':$[N'],count,all) |- queen(Q,0,N).
  17.  
  18.     queen(Q',N',N)          |- copy(count,N-1,Q);
  19.                                count' = count+1.
  20.     queen(Q',N',Size')      |- more(Q,N,0,Size).
  21.  
  22.     more(_, _, M',M).
  23.     more(Q',N',M',Size')    :- safe(Q,M,1,N) |-
  24.                                Q[N]' = M;
  25.                                queen(Q,N+1,Size);
  26.                                more(Q,N,M+1,Size).
  27.     more(Q',N',M',Size')    |- more(Q,N,M+1,Size).
  28.  
  29.     safe(_, _, I',I-1).
  30.     safe(Q',M',I',N')       |- (int) X'= Q[N-I];
  31.                                M <> X;
  32.                                M <> X+I;
  33.                                M <> X-I;
  34.                                safe(Q,M,I+1,N).
  35.  
  36.     copy(K',0, Q')          |- all[K,0]' = Q[0].
  37.     copy(K',I',Q')          |- all[K,I]' = Q[I]; copy(K,I-1,Q).
  38. }